package com.atguigu.gmall.pms.controller;

import java.util.List;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.atguigu.gmall.pms.entity.BrandEntity;
import com.atguigu.gmall.pms.service.BrandService;
import com.atguigu.gmall.common.bean.PageResultVo;
import com.atguigu.gmall.common.bean.ResponseVo;
import com.atguigu.gmall.common.bean.PageParamVo;

/**
 * 品牌
 *
 * @author rhine
 * @email gangge@atguigu.com
 * @date 2022-04-20 23:38:45
 */
@Api(tags = "品牌 管理")
@RestController
@RequestMapping("pms/brand")
public class BrandController {

    @Autowired
    private BrandService brandService;

    /**
     * 后端接受前端数据的几种情况:
     * <P> GET请求
     * 1.路径参数：/pms/brand/{id}   接收方式：@PathVariable("id") Long id
     * 2.请求参数：/pms/brand?t=1650610546386&pageNum=1&pageSize=10  接收方式1： 直接用javabean接收
     *            /pms/brand?t=1650610546386&pageNum=1&pageSize=10  接收方式2： @RequestParam("pageNum") Integer pageNum
     * 3.以上是针对get请求的,因为get请求没有请求体，所以才这么接收
     * <P> POST请求
     * 如果是get以外的请求，可以将json在请求体中提交，比如post请求，有以下几种情况
     * 一、请求体是json格式
     * 接收方式：
     * 1.@RequestBody javabean 我们直接@RequestBody接收javabean。简单
     * (@RequestBody就是请求体的意思，get方式没有请求体，所以不能对GetMapping的方法用@RequestBody)
     * (@RequestParam 无法接收json格式的，所以无法使用该注解)
     * json格式我们一定使用@RequestBody接收的，也许json中的数据格式就是集合，我们直接@RequestBody List<>
     * 二、前端传过来的是x-www-from-urlencoded表单
     * 接收方式：
     * 1.@RequestParam  用该注解，接受所有字段，麻烦
     * 2.拿到HttpServletRequest 请求头，getParameterMap()，拿到所有参数数据，封装成map  略微麻烦
     * 3.@RequestBody MultiValueMap<String,Object> map 用该注解，直接接收 整个请求体 形成map 略微麻烦
     * 4.直接用类接收，类中属性表示对应表中字段 简单
     * 三、前端传过来的是form表单
     * 接收方式：
     * 1.@RequestParam 用该注解，接受所有字段，麻烦
     * 2.拿到HttpServletRequest 请求头，getParameterMap()，拿到所有参数数据，封装成map 略微麻烦
     * 3.直接用类接收，类中属性表示对应表中字段 简单
     * 四、前端传过来的文件
     * 接收方式：
     * MultipartFile file
     * <P>>
     * 有时候前端代码写的用json格式，实际上穿过来的却是form表单，傻逼，这种情况也有。最好看请求报文
     * */
    @GetMapping
    @ApiOperation("分页查询")
    public ResponseVo<PageResultVo> queryBrandByPage(PageParamVo paramVo){
        PageResultVo pageResultVo = brandService.queryPage(paramVo);

        return ResponseVo.ok(pageResultVo);
    }


    /**
     * 信息
     */
    @GetMapping("/{id}")
    @ApiOperation("详情查询")
    public ResponseVo<BrandEntity> queryBrandById(@PathVariable("id") Long id){
		BrandEntity brand = brandService.getById(id);

        return ResponseVo.ok(brand);
    }

    /**
     * 保存
     */
    @PostMapping
    @ApiOperation("保存")
    public ResponseVo<Object> save(@RequestBody BrandEntity brand){
		brandService.save(brand);

        return ResponseVo.ok();
    }

    /**
     * 修改
     */
    @PostMapping("/update")
    @ApiOperation("修改")
    public ResponseVo update(@RequestBody BrandEntity brand){
		brandService.updateById(brand);

        return ResponseVo.ok();
    }

    /**
     * 删除
     */
    @PostMapping("/delete")
    @ApiOperation("删除")
    public ResponseVo delete(@RequestBody List<Long> ids){
		brandService.removeByIds(ids);

        return ResponseVo.ok();
    }

}
